package com.towker.core.page;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 分页请求信息
 * 其中范型<T>为filters的类型
 * @author badqiu
 */
public class PageRequest<T> implements Serializable
{
	/**
	 * 过滤参数
	 */
	private T filters = null;
	/**
	 * 页号码,页码从1开始
	 */
	private int pageNumber;
	/**
	 * 分页大小
	 */
	private int pageSize;
	/**
	 * 排序的多个列,如: username desc
	 */
	private String sortColumns;
	private String pageName = "page";
	private String pageSizeName = "pageSize";

	/**
	 * 获取页参数的名称
	 * @return
	 */
	public String getPageName()
	{
		return pageName;
	}

	/**
	 * 设置页面参数名称
	 * @param pageName
	 */
	public void setPageName(String pageName)
	{
		this.pageName = pageName;
	}

	/**
	 * 返回页大小的名称
	 * @return
	 */
	public String getPageSizeName()
	{
		return pageSizeName;
	}

	/**
	 * 设置页面大小参数名称
	 * @param pageSizeName
	 */
	public void setPageSizeName(String pageSizeName)
	{
		this.pageSizeName = pageSizeName;
	}

	public PageRequest()
	{
		this(0, 0);
	}

	public PageRequest(T filters)
	{
		this(0, 0, filters);
	}

	public PageRequest(int pageNumber, int pageSize)
	{
		this(pageNumber, pageSize, (T) null);
	}

	public PageRequest(int pageNumber, int pageSize, T filters)
	{
		this(pageNumber, pageSize, filters, null);
	}

	/**
	 * @param pageNumber 页码
	 * @param pageSize 页大小
	 * @param sortColumns 排序列
	 */
	public PageRequest(int pageNumber, int pageSize, String sortColumns)
	{
		this(pageNumber, pageSize, null, sortColumns);
	}

	/**
	 * @param pageNumber 页码
	 * @param pageSize 页大小
	 * @param filters 条件
	 * @param sortColumns 排序
	 */
	public PageRequest(int pageNumber, int pageSize, T filters, String sortColumns)
	{
		this.pageNumber = pageNumber;
		this.pageSize = pageSize;
		setFilters(filters);
		setSortColumns(sortColumns);
	}

	public T getFilters()
	{
		return filters;
	}

	public void setFilters(T filters)
	{
		this.filters = filters;
	}

	/**
	 * 取得当前页
	 * @return
	 */
	public int getCurrentPage()
	{
		return pageNumber;
	}

	/**
	 * 设置当前页
	 * @param pageNumber
	 */
	public void setCurrentPage(int pageNumber)
	{
		this.pageNumber = pageNumber;
	}

	public int getPageSize()
	{
		return pageSize;
	}

	public void setPageSize(int pageSize)
	{
		this.pageSize = pageSize;
	}

	public String getSortColumns()
	{
		return sortColumns;
	}

	/**
	 * 排序的列,可以同时多列,使用逗号分隔,如 username desc,age asc
	 * @return
	 */
	public void setSortColumns(String sortColumns)
	{
		this.sortColumns = sortColumns;
	}

	/**
	 * 将sortColumns进行解析以便返回SortInfo以便使用
	 * @return
	 */
	public List<SortInfo> getSortInfos()
	{
		return Collections.unmodifiableList(SortInfo.parseSortColumns(sortColumns));
	}
	/**
	 * 获得分页请求对象。
	 * @param currentPage 当前页码。
	 * @param pageSize 页码记录数。
	 * @param map 分页参数。
	 * */
	@SuppressWarnings("unchecked")
	public static PageRequest getPageRequest(int currentPage,int pageSize, Map map)
	{
		PageRequest request = new PageRequest();
		request.setFilters(map);
		request.setCurrentPage(currentPage);
		request.setPageSize(pageSize);
		return request;
	}
}
